# 导入 OpenCV 库，用于图像处理，如读取图像、进行直方图均衡化等操作
import cv2
# 导入 matplotlib 库的 pyplot 模块，用于绘制图像和直方图，方便可视化结果
import matplotlib.pyplot as plt
# 导入 numpy 库，用于处理数值计算，在图像处理中经常会用到数组操作
import numpy as np

# 读取图像
# 使用 cv2.imread 函数以灰度模式读取指定路径的图像
# 'your_image.jpg' 需替换为实际的图像文件路径
'''
当你使用 image = cv2.imread('test.png', 0) 时，后面的数值 0 代表读取图像的模式，具体含义如下：
cv2.IMREAD_COLOR（值为 1）：这是默认模式，会以彩色模式读取图像，忽略图像的透明度通道。最终返回的图像是一个包含三个通道（红、绿、蓝）的三维数组。
cv2.IMREAD_GRAYSCALE（值为 0）：以灰度模式读取图像。也就是将图像转换为单通道的灰度图像，最终返回的是一个二维数组。
cv2.IMREAD_UNCHANGED（值为 -1）：以包含透明度通道的方式读取图像。如果图像是带有透明度通道的（像 PNG 图像），那么会保留该通道信息。返回的图像可能是三维数组（对于彩色带透明通道的图像），也可能是二维数组（对于灰度带透明通道的图像）。
'''
# 0 表示以灰度模式读取，即读取的图像为单通道的灰度图像
image = cv2.imread('test.png', 0)  

# 进行直方图均衡化
# 使用 cv2.equalizeHist 函数对输入的灰度图像进行直方图均衡化处理
# 该函数会将图像的像素值重新分布，使图像的对比度增强
equalized_image = cv2.equalizeHist(image)

# 显示原始图像和均衡化后的图像
# 创建一个大小为 10x5 英寸的图形窗口，用于显示图像
plt.figure(figsize=(10, 5))

# 将图形窗口划分为 1 行 2 列的子图布局，并选择第 1 个子图
plt.subplot(121)
# 在当前子图中显示原始图像，使用灰度颜色映射
plt.imshow(image, cmap='gray')
# 为当前子图添加标题
plt.title('Original Image')
# 关闭当前子图的坐标轴显示
plt.axis('off')

# 选择第 2 个子图
plt.subplot(122)
# 在当前子图中显示均衡化后的图像，使用灰度颜色映射
plt.imshow(equalized_image, cmap='gray')
# 为当前子图添加标题
plt.title('Equalized Image')
# 关闭当前子图的坐标轴显示
plt.axis('off')

# # 显示整个图形窗口
# plt.show()

# 显示原始图像和均衡化后的直方图
# 创建一个新的大小为 10x5 英寸的图形窗口，用于显示直方图
plt.figure(figsize=(10, 5))

# 选择第 1 个子图
plt.subplot(121)
# 绘制原始图像的直方图
# image.flatten() 将二维图像数组展平为一维数组
# 256 表示直方图的 bins 数量
# [0, 256] 表示像素值的范围
# color='r' 表示直方图的颜色为红色
plt.hist(image.flatten(), 256, [0, 256], color='r')
# 为当前子图添加标题
plt.title('Original Histogram')

# 选择第 2 个子图
plt.subplot(122)
# 绘制均衡化后图像的直方图，参数含义与绘制原始图像直方图相同
plt.hist(equalized_image.flatten(), 256, [0, 256], color='r')
# 为当前子图添加标题
plt.title('Equalized Histogram')

# 显示整个图形窗口
plt.show()
    